实现JavaScript语言解释器(二)

您所在的位置:网站首页 js解释器 知乎 实现JavaScript语言解释器(二)

实现JavaScript语言解释器(二)

2024-05-30 05:57| 来源: 网络整理| 查看: 265

前言

在上一篇文章中我为大家介绍了Simpe项目的一些背景知识以及如何使用有限状态机来实现词法解析,在本篇文章中我将会为大家介绍语法分析的相关内容,并且通过设计一门内部DSL语言来实现Simple语言的语法解析。

什么是语法解析

词法解析过后,字符串的代码会被解析生成一系列Token串,例如下面是代码let a = 'HelloWorld';的词法解析输出:

[ { "type": "LET", "value": "let", "range": { "start": { "line": 1, "column": 1 }, "end": { "line": 1, "column": 3 } } }, { "type": "IDENTIFIER", "value": "a", "range": { "start": { "line": 1, "column": 5 }, "end": { "line": 1, "column": 5 } } }, { "type": "ASSIGN", "value": "=", "range": { "start": { "line": 1, "column": 7 }, "end": { "line": 1, "column": 7 } } }, { "type": "STRING_LITERAL", "value": "'HelloWorld'", "range": { "start": { "line": 1, "column": 9 }, "end": { "line": 1, "column": 20 } } }, { "type": "SEMICOLON", "value": ";", "range": { "start": { "line": 1, "column": 21 }, "end": { "line": 1, "column": 21 } } } ]

在语法解析(Syntax Analysis)阶段,Simple解释器会根据定义的语法规则来分析单词之间的组合关系,从而输出一棵抽象语法树(Abstract Syntax Tree),这也就我们常听到的AST了。那么为什么说这棵语法树是抽象的呢?这是因为在语法解析阶段一些诸如分号和左右括号等用来组织代码用的token会被去掉,因此生成的语法树没有包含词法解析阶段生成的所有token信息,所以它是抽象的。在语法解析阶段,如果Simple解释器发现输入的Token字符串不能通过既定的语法规则来解析,就会抛出一个语法错误(Syntax Error),例如赋值语句没有右表达式的时候就会抛出Syntax Error。

从上面的描述可以看出,词法解析阶段的重点是分离单词,而语法解析阶段最重要的是根据既定的语法规则来组合单词。那么对于Simple解释器来说,它的语法规则又是什么呢?

Simple语言的语法

我们前面说到Simple语言其实是JavaScript的一个子集,所以Simple的语法也是JavaScript语



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3